mod cli;
mod project;
mod project_parser;
mod cmake_generator;
mod errors;
mod logger;
mod sln_parser;
mod file_copier;
mod conversion_manager;
mod progress;
mod cpp_properties_generator;
mod clangd_generator;

use anyhow::Result;
use clap::Parser;
use log::warn;

use crate::errors::ConversionWarnings;
use crate::cli::Args;

fn main() -> Result<()> {
    let args = Args::parse();
    
    // 初始化日志
    logger::init_logger(if args.quiet { "off" } else { &args.log_level })?;
      // 创建转换器并执行转换
    let mut converter = conversion_manager::ConversionManager::new(&args.input, &args.output, args.qt_dir.clone())?;
    
    // 配置进度条
    if !args.quiet {
        converter = converter.with_progress(args.show_progress);
    }
    
    // 配置是否生成c_cpp_properties.json
    if args.generate_cpp_properties {
        converter = converter.with_cpp_properties(true);
    }
    
    // 配置是否生成.clangd配置文件
    if args.generate_clangd {
        converter = converter.with_clangd(true);
        if let Some(template_path) = &args.clangd_template {
            converter = converter.with_clangd_template(template_path);
        }
    }
    
    // 执行转换
    match converter.convert() {
        Ok(_) => {
            // 检查警告
            let warnings = converter.get_warnings();
            
            if warnings.has_warnings() && !args.quiet {
                if args.show_warnings {
                    print_detailed_warnings(warnings);
                } else {
                    print_warnings_summary(warnings);
                    println!("使用 -W 或 --show-warnings 显示详细警告信息");
                }
            }
            
            if !args.quiet {
                println!("转换完成！输出目录: {}", args.output.display());
            }
            Ok(())
        },
        Err(e) => {
            if !args.quiet {
                eprintln!("转换失败: {}", e);
                
                // 打印错误原因链
                let mut source = e.source();
                let mut level = 0;
                while let Some(err) = source {
                    level += 1;
                    eprintln!("原因 {}: {}", level, err);
                    source = err.source();
                }
            }
            
            // 返回错误
            Err(e)
        }
    }
}

/// 打印警告摘要
fn print_warnings_summary(warnings: &ConversionWarnings) {
    if !warnings.missing_files.is_empty() {
        warn!("警告: {} 个文件未找到", warnings.missing_files.len());
    }
    
    if !warnings.ignored_settings.is_empty() {
        warn!("警告: {} 个设置被忽略", warnings.ignored_settings.len());
    }
    
    if !warnings.path_issues.is_empty() {
        warn!("警告: {} 个路径问题", warnings.path_issues.len());
    }
}

/// 打印详细警告信息
fn print_detailed_warnings(warnings: &ConversionWarnings) {
    if !warnings.missing_files.is_empty() {
        warn!("警告: {} 个文件未找到", warnings.missing_files.len());
        for (i, file) in warnings.missing_files.iter().enumerate() {
            warn!("  {}. {}", i + 1, file.display());
            
            // 如果文件太多，只显示前10个
            if i >= 9 && warnings.missing_files.len() > 10 {
                warn!("  ... 以及 {} 个其他文件", warnings.missing_files.len() - 10);
                break;
            }
        }
    }
    
    if !warnings.ignored_settings.is_empty() {
        warn!("警告: {} 个设置被忽略", warnings.ignored_settings.len());
        for (i, setting) in warnings.ignored_settings.iter().enumerate() {
            warn!("  {}. {}", i + 1, setting);
            
            // 如果设置太多，只显示前10个
            if i >= 9 && warnings.ignored_settings.len() > 10 {
                warn!("  ... 以及 {} 个其他设置", warnings.ignored_settings.len() - 10);
                break;
            }
        }
    }
    
    if !warnings.path_issues.is_empty() {
        warn!("警告: {} 个路径问题", warnings.path_issues.len());
        for (i, issue) in warnings.path_issues.iter().enumerate() {
            warn!("  {}. {}", i + 1, issue);
            
            // 如果问题太多，只显示前10个
            if i >= 9 && warnings.path_issues.len() > 10 {
                warn!("  ... 以及 {} 个其他问题", warnings.path_issues.len() - 10);
                break;
            }
        }
    }
}
